<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>set</h1>
    <p>Set也是一种线性结构。但是与数组相比，它不确保数据存放和存储的顺序一致，但是确保内部的元素唯一性。</p>
    <p>使用new Set()创建一个Set对象。</p>
    <h2>常用属性</h2>
    <ul>
        <li>size：获取集合中元素的个数。</li>
    </ul>
    <h2>常用方法</h2>
    <ul>
        <li>add(object)：添加一个元素，返回集合本身的引用。</li>
        <li>has(object)：判断一个元素，是否在Set中存在。严格遵循，object === 元素的方式进行判断。</li>
        <li>delete(object)：从集合中移除元素。</li>
        <li>clear()：清空集合中的元素。</li> 
        <li>forEach(function)：遍历集合。</li>   
    </ul>
    <script>
        // 创建一个没有元素的空集合。
        let set1 = new Set();
        let r = set1.add(1);
        r = set1.add(2);
        console.log("r = ",r); // [1, 2]
        r = set1.add(1);
        console.log("r = ",r); // [ 1, 2 ]

        set1.add(3,4,5);
        console.log(set1); // [1,2,3]，add方法传入多个参数，只有第一个参数有效。

        set1.add(4).add(5).add(6); // 链式写法
        console.log(set1);

        // 判断元素是否在集合中存在
        r = set1.has(1);
        console.log("r = ",r);

        set1.add(null);
        console.log("set1 = ",set1);

        r = set1.has(null);
        console.log("r = ",r); // true

        r = set1.has("1");
        console.log("r = ",r); // false

        set1.add(undefined);
        console.log("set1 = ",set1);
        r = set1.has(undefined);
        console.log("r = ",r);

        set1.add(+0);
        set1.add(-0);
        console.log(+0 === -0); // true
        console.log("set1 = ",set1);

        console.log(set1.size); // 9

        // Set可以使用一个可遍历对象来构建Set
        let set2 = new Set([1,2,3,4,5]);
        console.log("Set2 = ",set2);


    </script>
</body>
</html>